package n60_unsafe;

import sun.misc.Unsafe;

import java.lang.reflect.Field;

/**
 * @author fu
 * @date 2022-02-19 18:22
 * 概要：
 * ---------------------------------------------------------------
 * |                                                              |
 * |     Unsafe 对象提供了非常底层的，操作内存、线程的方法，            |
 * |     Unsafe 对象不能直接调用，只能通过反射获得                    |
 * |                                                             |
 * |=============================================================
 *
 * 获取 Unsafe对象
 *  注意 ： Unsafe并不是不安全类，而是因为操作底层内存和线程 不推荐项目使用，项目使用会不安全而已
 *  使用步骤：
 *      1.  获取对象o
 *      2.  利用反射 获取 Field 字段属性名
 *      3.  o.objectFieldOffset() 获取偏移量
 *      4.  o.compareAndSwapInt()|o.compareAndSwapObject()  cas方法 操作成员变量值
 */
public class T1_UnsafeAccessor_非常底层的操作内存和线程方法 {

    static private Unsafe unsafe;

    static {
        try {
            final Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
            theUnsafe.setAccessible(true);
            unsafe = (Unsafe) theUnsafe.get(null);

        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
            throw new Error(e);
        }

    }

    static Unsafe getUnsafe(){
        return unsafe;
    }


}
